---
sidebar_position: 1
---

# Структуры C++

:::caution
Данная статья взята "как есть" из предыдущей версии методического пособия. Код из данной статьи может быть неподготовленным к использованию на Linux. Данная статья приведена лишь с ознакомительной целью.
:::

Структуры в C++ обладают практически теми же возможностями, что и классы, но чаще их применяют просто для логического объединения связанных между собой данных. В структуру, в противоположность массиву, можно объединять данные различных типов.

Например, требуется обрабатывать информацию о расписании работы конференц-зала, и для каждого мероприятия надо знать время, тему, фамилию организатора и количество участников. Поскольку вся эта информация относится к одному событию, логично дать ему имя, чтобы впоследствии можно было к нему обращаться. Для этого описывается новый тип данных (обратите внимание на то, что после описания стоит точка с запятой):

```cpp
struct Event {
int hour, min;
char theme[100], name[100];
int num; 
};
```

Имя этого типа данных — `Event`. Можно описать переменные этого типа точно так же, как переменные встроенных типов, например:

```cpp
Event el, e2[10]; // структура и массив структур
```

Если структура используется только в одном месте программы, можно совместить описание типа с описанием переменных, при этом имя типа можно не указывать:

```cpp
struct {
int hour, min;
char theme[100], name[100];
int num; 
} e1, e2[10];
```

Переменные структурного типа можно размещать и в динамической области памяти, для этого надо описать указатель на структуру и выделить под нее место:

```cpp
Event *pe = new Event; // структура
Event *pm = new Event[m]: // массив структур
```

Элементы структуры называются полями. Поля могут быть любого основного типа, массивом, указателем, объединением или структурой. Для обращения к полю используется операция выбора («точка» (.) для переменной и -> для указателя), например:

```cpp
el.hour = 12; el.min= 30;
strncpy(e2[0].theme,"Выращивание кактусов ", 99);
ре-> num = 30; // или (*pe).num = 30;
pm[2].hour = 14; // или (*(pm + 2)).hour = 14;
```

Структуры одного типа можно присваивать друг другу:

```cpp
*ре = el;  pm[l] = el;  pm[4] = e2[0];
```

Но присваивание - это и все, что можно делать со структурами целиком. Другие операции, например сравнение на равенство или вывод, не определены. Впрочем, пользователь может задать их самостоятельно, поскольку структура является видом класса, а в классах можно определять собственные операции. Мы рассмотрим эту тему во втором семестре.
Ввод/вывод структур, как и массивов, выполняется поэлементно. Вот, например, как выглядит ввод и вывод описанной выше структуры e1:

```cpp
cin >> e1.hour >> e1.min;
cin. getline (e1. theme, 100);
cout << e1.hour << '  ' << e1.min << '  ' << e1.theme << endl;
```

Структуры (но, конечно, не динамические) можно инициализировать перечислением значений их элементов:

```cpp
Event е3 = {12, 30, "Выращивание кактусов ", "Петрова",25};
```
